﻿<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>FileSelectFile</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="../css/commands.css" type="text/css" rel="stylesheet">
<link media="print" href="../css/print.css" type="text/css" rel="stylesheet">
</head>
<body>

<h1>FileSelectFile</h1>

<p>显示一个允许用户来打开或保存文件的标准对话框。</p>
<p class="CommandSyntax">FileSelectFile,OutputVar[,Options,RootDir\Filename,Prompt,Filter]</p>

<h3>参数 </h3>
<table border="1" bordercolor="#c0c0c0" cellpadding="3" cellspacing="0" width="100%">
    <tr>
      <td width="15%">OutputVar</td>
      <td width="85%">用来保存用户选择的文件名的变量名称。如果用户取消了对话框(即不想选择一个文件)，该变量为空。 </td>
    </tr>
    <tr>
      <td>Options</td>
      <td>
      <p>如果省略此项，默认值为 0，意味着以下选项都不生效。</p>
      <p><strong>M</strong>: 多选。指定字母 M 表示允许用户通过按住 Shift、Control 键或者其它方式来选择多个文件。<strong>M</strong> 后面可以跟一个下面提到的数字(例如，M 和 M1 都是有效的)。要提取单个文件，请看本页底部的例子。</p>
      <p><strong>S</strong>: 保存按钮。指定字母 S 使对话框上总是包含保存按钮而不是打开按钮。<strong>S</strong> 后面可以跟一个下面提到的数字(或几个数的和。例如，S 和 S24 都是有效的)。 </p>
      <p>即使没有 <strong>M</strong> 和 <strong>S</strong>，下列数字也可以被使用。要同时使多个选项生效，只要把数字加起来。例如，要使用 8 和 16，指定数字 24。</p>
      <p><strong>1</strong>：文件必须存在<br>
      <strong>2</strong>：路径必须存在<br>
      <strong>8</strong>：提示创建新文件<br>
      <strong>16</strong>：提示覆盖文件<br>
      <strong>32</strong> [v1.0.43.09+]：选择的快捷方式(.lnk 文件)是它本身而不是它所指向的目标。此选项也防止了选择一个文件夹快捷方式会跳转到那个文件夹。</p>
      <p>如果用“提示覆盖文件”选项并且不用“提示创建新文件”选项的话，对话框将包含保存按钮而不是打开按钮。这个问题是 Windows 的毛病。</p>
      </td>
    </tr>
    <tr>
      <td>RootDir\Filename</td>
      <td>
      <p>如果存在，此参数可包含下列的一项或全部：</p>
      <p><strong>RootDir</strong>：根(起始)目录，如果没有使用完全路径的话，假设为 <a href="../Variables.htm#WorkingDir">%A_WorkingDir%</a> 里的子文件夹。如果省略此参数或留空，起始目录会是默认值，而且随操作系统版本而有所不同(在 WinNT/2k/XP 及之后的版本中，它通常是用户上一次使用 FileSelectFile 时选择的目录)。在 v1.0.43.10 及之后的版本中，支持使用 <a href="../misc/CLSID-List.htm">CLSID(Windows 类标识符)</a>比如 <em>::{20d04fe0-3aea-1069-a2d8-08002b30309d}</em>(即我的电脑)，这时在 CLSID 后面的任何子目录路径都必须以反斜线结尾(否则，最后一个反斜杠之后的字符串将被认为是默认的文件名，请看下面)。</p>
      <p><strong>Filename</strong>：一开始显示在对话框里的编辑框中的默认文件名。只有单独的文件名(不带路径)才会被显示。要确保对话框正确地显示，请不要提交非法的字符(比如 /&lt;|:")。</p>

      <p>示例：</p>
      <pre>C:\My Pictures\Default Image Name.gif <em>; <em>RootDir</em> 和 <em>Filename</em> 都提供了。</em><br>C:\My Pictures <em>;只提供了 <em>RootDir</em>。</em><br>My Pictures <em>;只提供了 <em>RootDir</em>，它相对于当前的工作目录。</em><br>My File <em>;只提供了 <em>Filename</em>(但如果存在&ldquo;My File&rdquo;文件夹，则会被认为是 <em>RootDir</em>)。</em></pre>
      </td>
    </tr>
    <tr>
      <td>Prompt</td>
      <td>显示在窗口标题栏指示用户做什么的文本。如果省略或留空，它将默认为"Select File - %A_SCRIPTNAME%" (即当前脚本的名称)。</td>
    </tr>
    <tr>
      <td>Filter</td>
      <td>
      <p>指示哪些类型的文件会被对话框显示。</p>
      <p>例如：Documents (*.txt)<br>
例如：Audio (*.wav; *.mp2; *.mp3)</p>
      <p>如果省略，过滤器默认是 All Files (*.*)。另外在对话框的&ldquo;文件类型&rdquo;下拉列表中的 Text Documents (*.txt) 选项也是可用的。</p>
      <p>否则，过滤器将使用此参数指示的字符串，不过在对话框的&ldquo;文件类型&rdquo;下拉列表中仍然提供 All Files (*.*) 的选项。要在过滤器中包含多个文件扩展名，像上面的例子中那样用分号将它们隔开。</p>
      </td>
    </tr>
</table>

<h3>ErrorLevel</h3>
<p>如果用户没有选择文件(比如按了取消按钮)就关掉了对话框，<a href="../misc/ErrorLevel.htm">ErrorLevel</a> 设为 1。如果系统拒绝显示对话框时(罕见)也将设为 1。之外设为 0。</p>

<h3>注意</h3>
<p>如果用户什么也没选(例如按了取消)，<em>OutputVar</em> 为空。</p>
<p>如果没有使用多选，<em>OutputVar</em> 的值将设为用户选择的单个文件的完整路径和名称。</p>
<p>如果使用了 M 选项(多选)，<em>OutputVar</em> 的值将设为一个列表，其中除了最后一个外，每个后面都跟了一个换行符(`n)。列表中的第一行是所有被选择的文件的路径(只有在此路径是根目录比如 C:\ 时才以反斜线结尾)。其它的条目是被选择的文件名(不带路径)。例如：<br>
C:\My Documents\New Folder [这是下面所有文件所在的路径]<br>
test1.txt [这些是单独的文件名：没有路径]<br>
test2.txt<br>
&hellip;&hellip;等。<br>
(本页底部的例子示范了如何一个个提取文件。)</p>

<p>在使用多选时，被选择的文件名的总长度被限制在 64 KB。不过通常这足以容纳几千个文件了，如果超出此限制的话，<em>OutputVar</em> 将为空。 </p>

<p>GUI 窗口可以用 <a href="Gui.htm#OwnDialogs">Gui +OwnDialogs</a> 来显示一个 modal(模态)文件选择对话框。模态对话框可以阻止用户在关掉对话框之前与 GUI 窗口的交互。</p>

<p>已知限制：在文件选择对话框显示期间运行的<a href="SetTimer.htm">定时器</a>会延迟用户在对话框中点击的效果直到定时器结束。要绕弯解决此限制，应避免使用那些子程序会运行很长时间才结束的定时器，或者在使用对话框时禁用所有的定时器：</p>
<pre><a href="Thread.htm">Thread</a>，NoTimers<br>FileSelectFile，OutputVar<br>Thread，NoTimers，false</pre>
<p>作废的选项：在 v1.0.25.06 及之后的版本中，多选选项&ldquo;4&rdquo;已作废。可是为了与以前的脚本兼容，这个选项仍然可用。具体是，如果用户只选择了一个文件，<em>OutputVar</em> 会包括它的完整路径和文件名再加上一个换行符(`n)。如果用户选择了多个文件，除了最后一行还是以换行符(`n)结尾外，其它的格式都和上面描述的 M 选项一样。</p>

<h3>相关命令</h3>
<p><a href="FileSelectFolder.htm">FileSelectFolder</a>, <a href="MsgBox.htm">MsgBox</a>, <a href="InputBox.htm">InputBox</a>, <a href="ToolTip.htm">ToolTip</a>, <a href="Gui.htm">GUI</a>, <a href="../misc/CLSID-List.htm">CLSID List</a>, <a href="LoopParse.htm">parsing loop</a>, <a href="SplitPath.htm">SplitPath</a></p>
<p>操作系统也提供了标准的对话框来提示用户选择字体、颜色或图标。这些对话框可以通过 <a href="DllCall.htm">DllCall()</a> 命令来显示，请看 <a href="http://www.autohotkey.com/forum/topic17230.html">www.autohotkey.com/forum/topic17230.html</a>。</p>

<h3>示例</h3>
<pre class="NoIndent">FileSelectFile, SelectedFile, 3, , 打开一个文件 (*.txt; *.doc)
if SelectedFile =
    MsgBox, 用户什么也没有选择。
else
    MsgBox, 用户选了下列文件:`n%SelectedFile%


<a href="../misc/CLSID-List.htm">CLSID</a> 示例:
FileSelectFile, OutputVar,, ::{645ff040-5081-101b-9f08-00aa002f954e}  <em>;回收站。</em>

<em>;多选示例:</em>
FileSelectFile, files, M3  <em>; M3 = 选择多个存在的文件。</em>
if files =
{
    MsgBox, 用户按了取消。
    return
}
Loop, parse, files, `n
{
    if a_index = 1
        MsgBox, 选择的文件都包含在 %A_LoopField%。
    else
    {
        MsgBox, 4, , 下一个文件是 %A_LoopField%。继续？
        IfMsgBox, No, break
    }
}
return</pre>

</body>
</html>